<?php

// 生成url
function U($url, $args = "") {
	$default_modular = \core\libs\config::get('app', 'MODULAR->default_modular');
	if(APP_MODULAR == $default_modular) {
		return APP_ROOT . $url . $args;
	}
	else {
		return APP_ROOT . APP_MODULAR . '/' . $url . $args;
	}
}
 
/* 
 * 奖项数组 
 * 是一个二维数组，记录了所有本次抽奖的奖项信息， 
 * 其中id表示中奖等级，prize表示奖品，v表示中奖概率。 
 * 注意其中的v必须为整数，你可以将对应的 奖项的v设置成0，即意味着该奖项抽中的几率是0， 
 * 数组中v的总和（基数），基数越大越能体现概率的准确性。 
 * 本例中v的总和为100，那么平板电脑对应的 中奖概率就是1%， 
 * 如果v的总和是10000，那中奖概率就是万分之一了。 
 *  
 */
function get_prize_arr($prize_arr) {	
    foreach ($prize_arr as $key => $val) { 
        $arr[$val['id']] = $val['v']; 
    }  
    return $arr;
}

/* 
 * 经典的概率算法， 
 * $proArr是一个预先设置的数组， 
 * 假设数组为：array(100,200,300，400)， 
 * 开始是从1,1000 这个概率范围内筛选第一个数是否在他的出现概率范围之内，  
 * 如果不在，则将概率空间，也就是k的值减去刚刚的那个数字的概率空间， 
 * 在本例当中就是减去100，也就是说第二个数是在1，900这个范围内筛选的。 
 * 这样 筛选到最终，总会有一个数满足要求。 
 * 就相当于去一个箱子里摸东西， 
 * 第一个不是，第二个不是，第三个还不是，那最后一个一定是。 
 * 这个算法简单，而且效率非常 高， 
 * 关键是这个算法已在我们以前的项目中有应用，尤其是大数据量的项目中效率非常棒。 
 */  
function get_rand($proArr) {   
    $result = '';    
    //概率数组的总概率精度   
    $proSum = array_sum($proArr);    
    //概率数组循环   
    foreach ($proArr as $key => $proCur) {   
        $randNum = mt_rand(1, $proSum);   
        if ($randNum <= $proCur) {   
            $result = $key;   
            break;   
        } else {   
            $proSum -= $proCur;   
        }         
    }   
    unset ($proArr);    
    return $result;   
}

// 微信昵称特殊符号过滤
function filterEmoji($str) {
    $str = preg_replace_callback( '/./u',
	function (array $match) {
    	return strlen($match[0]) >= 4 ? '' : $match[0];
    }, $str);

	return $str;
}

/*	
 * 获取完整路径
 * @param $args 待拼接内容
 * @param $type 类型（0数组，1单个内容）
 * @return 数组	 
 */	
function getPath($args, $type = 0) {
	$temp = [];
	foreach(explode(',', $args) as $pic) {
		if($pic) $temp[] = \core\libs\config::get('app', 'BASE->url') . 'static/' . $pic;
	}
	return $type == 1 ? ($temp ? $temp[0] : "") : $temp;
}

/*
 * 生成随机验证码
 * @param $length  int 长度
 * @param $numeric int 0：数字+字母，1纯数字
 * @param @return 返回随机验证码
 */
function random($length = 6 , $numeric = 0) {
	PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
	
	if($numeric) {
		$hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));		
	}
	else {
		$hash = '';
		$chars = 'ABCDEFGHJKLMNPQRSTUVWXYZ23456789abcdefghjkmnpqrstuvwxyz';
		$max = strlen($chars) - 1;
		
		for($i = 0; $i < $length; $i++)	{
			$hash .= $chars[mt_rand(0, $max)];
		}
	}
	
	return $hash;
}

/*	
 * 生成N个无重复随机数	
 * @param $number 数量
 * @return 数组	 
 */	
function getRandomArray($number) {
	$result = array();
	$num = 0;
	
	while($num < $number) {
		$result[] = substr(uniqid('', true), 19).substr(microtime(), 2, 6);
		$num++;
	}
	
	if($result === array_unique($result)) {
		return $result;//数据没有重复，可以使用			
	}
	else {
		return 'no';//有重复数据，数据不能使用！
	}
}

/*
 * 截取字符串(UTF-8)
 * @param string $str 原始字符串
 * @param $position 开始截取位置
 * @param $length 需要截取的偏移量
 * @return string 截取的字符串
 * $type=1 等于1时末尾加'...'不然不加
 */ 	
function utfSubstr($str, $position, $length, $type) {
	$startPos = strlen($str);
	$startByte = 0;
	$endPos = strlen($str);
	$count = 0;
	
	for($i=0; $i<strlen($str); $i++) {
		if($count>=$position && $startPos>$i) {
			$startPos = $i;
			$startByte = $count;
		}
		
		if(($count-$startByte) >= $length) {
			$endPos = $i;
			break;
		}
		
		$value = ord($str[$i]);
		
		if($value > 127) {
			$count++;
			if($value>=192 && $value<=223) {
				$i++;				
			}
			elseif($value>=224 && $value<=239) {
				$i = $i + 2;				
			}
			elseif($value>=240 && $value<=247) {
				$i = $i + 3;				
			}
			else {
				return "\"$str\" Not a UTF-8 compatible string";
			}
		}
		
		$count++;
	}

	if($type==1 && (strlen($str) - (strlen($str) / 3)) > $length) {
		return substr($str, $startPos, $endPos-$startPos)."...";   
	}
	else {
		return substr($str, $startPos, $endPos-$startPos);
	}  
}

/*	
 * 弹出一个窗口	 
 * @param $str 消息
 * @param $url 返回地址	 
 */	 
function alert($str, $url = "") {
	echo "<script>";
	if($str) echo "alert('$str');";
	if($url) echo "location.href = '$url'";
	echo "</script>";

	if($url) exit;
}


// 跳转地址
function jump($url, $code = "302") {
	header("HTTP/1.1 $code Moved Permanently");
	header("Location: $url");
	exit;
}

/*
 * 调试数据
 * 格式化数组并输出，可以传入任意多的参数
 */	
function op() {
	$args = func_get_args();
	foreach ($args as $arg) {
		echo "<pre>";
		print_r( $arg );
		echo "<pre>";
	}
}

/**
 * 结束并输出json格式
 * @param array $array
 * return void
 */
function exit_json( $array ) {
	header('Content-Type:application/json; charset=utf-8');
	exit(json_encode($array, JSON_PRESERVE_ZERO_FRACTION));
}

/**
 * 格式化价格，保留后两位
 * @param float $number
 * return float 格式化后的价格
 */
function format_price( $number ) {
	return number_format(round(($number), 2), 2, ".", "");
}

/*	
 * 手机号格式化
 * @param int $tel 11位手机号 	 
 * @return string 隐藏中间的手机号
 */	
function format_tel($tel) {
	return substr_replace($tel, '****', 3, 4);
}

/**
 * 获取客户端IP
 * return string IP地址
 */
function get_real_ip() {
	$ip = $_SERVER['REMOTE_ADDR'];
	if (isset($_SERVER['HTTP_X_FORWARDED_FOR']) && preg_match_all('#\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}#s', $_SERVER['HTTP_X_FORWARDED_FOR'], $matches)) {
		foreach ($matches[0] AS $xip) {
			if (!preg_match('#^(10|172\.16|192\.168)\.#', $xip)) {
				$ip = $xip;
				break;
			}
		}
	} elseif (isset($_SERVER['HTTP_CLIENT_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CLIENT_IP'])) {
		$ip = $_SERVER['HTTP_CLIENT_IP'];
	} elseif (isset($_SERVER['HTTP_CF_CONNECTING_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_CF_CONNECTING_IP'])) {
		$ip = $_SERVER['HTTP_CF_CONNECTING_IP'];
	} elseif (isset($_SERVER['HTTP_X_REAL_IP']) && preg_match('/^([0-9]{1,3}\.){3}[0-9]{1,3}$/', $_SERVER['HTTP_X_REAL_IP'])) {
		$ip = $_SERVER['HTTP_X_REAL_IP'];
	}
	return $ip;
}

 /**
 * 将xml转为array
 * @param string $xml
 * return array
 */
function xml_to_array($xml){
    if(!$xml){
        return false;
    }
    //将XML转为array
    //禁止引用外部xml实体
    libxml_disable_entity_loader(true);
    $data = json_decode(json_encode(simplexml_load_string($xml, 'SimpleXMLElement', LIBXML_NOCDATA)), true);
    return $data;
}
	
//数组拼接为URL
function array_to_url( $params ) {
    $string = '';
    if( !empty($params) ){
        $array = array();
        foreach( $params as $key => $value ) {
            $array[] = $key.'='.$value;
        }
        $string = implode("&",$array);
    }
    return $string;
}

/**
 * 输出xml字符（数组转换成xml）
 * @param $params 参数名称
 * return string 返回组装的xml
 **/
function array_to_xml( $params ){
    if(!is_array($params)|| count($params) <= 0) {
        return false;
	}
	$xml = "<xml>";
	foreach ($params as $key => $val) {
		if (is_numeric($val)){
			$xml.="<".$key.">".$val."</".$key.">";
		}else{
			$xml.="<".$key."><![CDATA[".$val."]]></".$key.">";
		}
	}
	$xml.="</xml>";
	return $xml;
}

/*	 
 * 编辑器	 
 */	 
function kindeditor($id, $val, $content) {
	$html = '<script type="text/javascript">
				var editor;
				KindEditor.ready(function(K) {
					editor = K.create(\'textarea[id="'. $id .'"]\', 
					{
						allowPreviewEmoticons : false,
						allowImageUpload : true,
						filterMode : false,
						autoSetDataMode : false,
						minWidth : 670,
						urlType : "",
						themeType : "simple",
						items : ["source", "|", "fontname", "fontsize", "|", "forecolor", "hilitecolor", "bold", "italic", "underline", "removeformat", "|", "justifyleft", "justifycenter", "justifyright", "|", "emoticons", "image", "|", "insertfile", "media", "|", "link"]
					});
				});
			</script>';
	$html .= "<textarea id='$id' name='$val' style='width:100%; height:300px; visibility:hidden;'>$content</textarea>";
	echo $html;
}

/*
 * KindEditor 编辑器内容格式化， 替换标签
 */
function kindhtml($html) {	
	$html = str_replace('&nbsp;', '&amp;nbsp;', $html); 
	$html = str_replace('&gt;', '&amp;gt;', $html); 
	$html = str_replace('&lt;', '&amp;lt;', $html);
	return $html;
}